// 购物车状态
import { mergeLocalCart, findCartList, insertCart, deleteCart, updateCart, checkAllCart } from '@/api/cart'
export default {
  namespaced: true,
  state: () => ({
    // 购物车列表数据
    list: []
  }),
  mutations: {
    // 存储后台购物车数据
    setList (state, list) {
      state.list = list
    },
    // 加入购物车：向list中添加商品
    /**
     *
     * @param {*} state 获取变量对象
     * @param {*} good 当前加入list商品数据
     */
    addCart (state, good) {
      /**
       * 把sku选择的商品unshift到list？
       * 不行=》排重
       * 思路：根据skuId判断是否之前加入过
       *    1. 加入过=》累加数量
       *    2. 没加入过 =》 unshift到list（新增）
       */
      const addedIndex = state.list.findIndex(item => item.skuId === good.skuId)
      if (addedIndex > -1) {
        // 加入过
        state.list[addedIndex].count += good.count
      } else {
        // 没加入过
        state.list.unshift(good)
      }
    },
    // 商品单选
    /**
     *
     * @param {*} state
     * @param {*} { good 当前选择的商品, sel选中状态 }
     */
    singleCheck (state, { good, sel }) {
      /**
       * 1. 根据good找到单选商品
       * 2. 修改找到商品的选中状态
       */
      const currGood = state.list.find(item => item.skuId === good.skuId)
      currGood.selected = sel
    },
    // 全选
    /**
     *
     * @param {*} state
     * @param {*} sel 全选框选中状态
     */
    allCheck (state, sel) {
      state.list.forEach(item => {
        item.selected = sel
      })
    },
    // 删除
    /**
     *
     * @param {*} state
     * @param {*} good 当前要删除商品
     */
    delCart (state, good) {
      /**
       * 1. 根据good找到要删除商品索引值
       * 2. 通过splice删除
       */
      const i = state.list.findIndex(item => item.skuId === good.skuId)
      state.list.splice(i, 1)
    },
    // 修改数量
    setCount (state, { good, newCount }) {
      const currGood = state.list.find(item => item.skuId === good.skuId)
      currGood.count = newCount
    }
  },
  getters: {
    /**
     * 1. 有效商品列表=》无效商品（没库存或下架了）
      2. 选中的购物车商品数据
      3. 选中商品总价
      4. 购物车中有效商品是否是全部选中状态
     * @param {*} state
     * @returns
     */
    // 有效商品列表
    validList: state => {
      return state.list.filter(item => item.isEffective)
    },
    // 有效商品列表选中的商品
    validSeled: (state, getters) => {
      return getters.validList.filter(item => item.selected)
    },
    // 有效商品列表选中商品的总价
    validSeledTotal (state, getters) {
      return getters.validSeled.reduce((acc, good) => (acc += good.count * good.nowPrice), 0)
    },
    // 有效商品列表是否是全部选中状态
    isAll (state, getters) {
      return getters.validList.every(good => good.selected)
    }

  },
  actions: {
    async getListAction ({ commit }) {
      const { result } = await findCartList()
      commit('setList', result)
    },
    /**
     * 登录成功后合并本地购物车数据到当前登录人名下
     * @param {*} param0
     */
    async mergeCartAction ({ state, dispatch }) {
      /**
       * 1. 判断本地是否有之前未登录添加的购物车商品数据
       * 2. 如果有调用接口进行合并
       * 3. 调用接口获取合并后最新的购物车数据（当前登录人）
       */
      if (state.list.length) {
        const mergeData = state.list.map(({ skuId, selected, count }) => {
          return { skuId, selected, count }
        })
        await mergeLocalCart(mergeData)
      }
      // 调用接口获取合并后最新的购物车数据
      dispatch('getListAction')
    },
    /**
     * 加入购物车action(异步)
     * 思路：区分是否登录=》1. 未登录，直接调用addCart存本地 2. 登陆了，调用接口存到数据库
     * @param {*} param{commit, rootState获取其它模块的state变量}
     * @param {*} good 当前加入list商品数据
     * return Promise对象
     */
    async addCartAction ({ commit, rootState, dispatch }, good) {
      // console.log(rootState)
      if (rootState.user.profile.token) {
        // 已经登录（调用接口存到数据库）=》随后会实现
        /**
         * 1. 调用加入购物车接口=》存到数据
         * 2. 重新查接口获取最新购物车数据=》list
         */
        await insertCart(good)
        dispatch('getListAction')
        return '加入购物车成功！'
      } else {
        // 没有登录
        // console.log('111111')
        commit('addCart', good)
        return '加入购物车成功！'
      }
    },
    // 单选
    async singleCheckAction ({ commit, rootState, dispatch }, { good, sel }) {
      if (rootState.user.profile.token) {
        // 已经登录（调用接口存到数据库）=》随后会实现
        await updateCart({ ...good, selected: sel })
        dispatch('getListAction')
      } else {
        // 没有登录
        // console.log('111111')
        commit('singleCheck', { good, sel })
      }
    },
    // 全选
    async allCheckAction ({ commit, rootState, dispatch, getters }, sel) {
      if (rootState.user.profile.token) {
        // 已经登录（调用接口存到数据库）=》随后会实现
        const ids = getters.validList.map(item => item.skuId)
        await checkAllCart({ selected: sel, ids })
        dispatch('getListAction')
      } else {
        // 没有登录
        // console.log('111111')
        commit('allCheck', sel)
      }
    },
    // 删除
    async delCartAction ({ commit, rootState, dispatch }, good) {
      if (rootState.user.profile.token) {
        // 已经登录（调用接口存到数据库）=》随后会实现
        await deleteCart([good.skuId])
        dispatch('getListAction')
      } else {
        // 没有登录
        // console.log('111111')
        commit('delCart', good)
      }
    },
    // 修改数量
    async setCountAction ({ commit, rootState, dispatch }, { good, newCount }) {
      if (rootState.user.profile.token) {
        // 已经登录（调用接口存到数据库）=》随后会实现
        await updateCart({ ...good, count: newCount })
        dispatch('getListAction')
      } else {
        // 没有登录
        // console.log('111111')
        commit('setCount', { good, newCount })
      }
    }
  }
}
